/**
 * Notes: 通用工具函数
 * Ver : CCMiniCloud Framework 2.38.1 ALL RIGHTS RESERVED BY cclinux0730 (wechat)
 * Date: 2020-09-05 04:00:00 
 */

function getProjectId() {
	if (global.PID)
		return global.PID;
	else
		return 'ONE';
}

/**
 * 判断变量，参数，对象属性是否定义
 * @param {*} val 
 */
function isDefined(val) {
	// ==  不能判断是否为null
	if (val === undefined)
		return false;
	else
		return true;
}

/**
 * 判断对象是否为空
 * @param {*} obj 
 */
function isObjectNull(obj) {
	return (Object.keys(obj).length == 0);
}



/**
 * 休眠时间，配合await使用 
 * @param {*} time 毫秒
 */
function sleep(time) {
	return new Promise((resolve) => setTimeout(resolve, time));
};

/**
 * 安全获取对象属性值
 * @param {Object} obj - 源对象
 * @param {String} path - 属性路径，例如：'user.name'
 * @param {Any} defaultValue - 默认值
 * @returns {Any} 属性值或默认值
 */
function safeGet(obj, path, defaultValue = undefined) {
	if (!obj || typeof obj !== 'object') return defaultValue;
	
	const keys = path.split('.');
	let value = obj;
	
	for (const key of keys) {
		if (value === null || value === undefined || typeof value !== 'object') {
			return defaultValue;
		}
		value = value[key];
	}
	
	return value === undefined ? defaultValue : value;
}

/**
 * 格式化API响应对象
 * @param {Number} code - 状态码
 * @param {String} msg - 消息
 * @param {Object} data - 数据对象
 * @returns {Object} 格式化的响应对象
 */
function formatResponse(code = 200, msg = 'success', data = null) {
	const response = {
		code,
		msg,
		data: data || {}
	};
	
	// 确保响应对象可序列化
	try {
		return JSON.parse(JSON.stringify(response));
	} catch (e) {
		console.error('响应对象序列化失败:', e);
		return {
			code: 500,
			msg: '响应数据处理错误',
			data: {}
		};
	}
}

/**
 * 判断变量是否已定义（非null和undefined）
 * @param {Any} val - 要检查的变量
 * @returns {Boolean} 是否已定义
 */
function isDefined(val) {
	return val !== null && val !== undefined;
}

/**
 * 判断变量是否为空（null、undefined或空字符串）
 * @param {Any} val - 要检查的变量
 * @returns {Boolean} 是否为空
 */
function isEmpty(val) {
	return val === null || val === undefined || val === '';
}

/**
 * 深度克隆对象
 * @param {Object} obj - 要克隆的对象
 * @returns {Object} 克隆后的对象
 */
function deepClone(obj) {
	if (obj === null || typeof obj !== 'object') {
		return obj;
	}
	
	try {
		return JSON.parse(JSON.stringify(obj));
	} catch (e) {
		console.error('对象深度克隆失败:', e);
		return Object.assign({}, obj); // 浅克隆作为备选
	}
}

module.exports = {
	getProjectId,
	isDefined, //判断变量，参数，对象属性是否定义  
	sleep,
	isObjectNull,
	safeGet,
	formatResponse,
	isEmpty,
	deepClone
}